WCF Chat 示例

获取示例和安装示例的说明

  • 执行下列一项或多项操作:

    • “帮助”菜单上单击“示例”

      “自述”显示有关示例的信息。

    • 访问 Visual Studio 2008 示例网站。该网站上提供了示例的最新版本。

    • 在安装 Visual Studio 的计算机上查找示例。默认情况下,示例和自述文件安装在驱动器:\Program Files\Microsoft Visual Studio 9.0\Samples\lcid 下。对于 Visual Studio 速成版而言,所有示例都在网上提供。

有关更多信息,请参见定位示例文件

运行示例

  1. “解决方案资源管理器”中打开 .sln 文件。

    只要有步骤涉及到某个客户端或服务,这些步骤就适用于示例的单个实例(因为 Chat 示例不是客户端或服务应用程序)。

  2. 按 F5 运行 Chat 应用程序。

  3. 启动您所需数量的实例(命名实例且位于 Visual Basic 安装路径\Projects\Chat\Instance\Bin\Debug\Instance.exe 中)。通过输入昵称(该昵称会区别从特定客户端实例发送的消息)来启动。输入此名称之后,马上便可以将聊天消息发送到网格。这些消息应发送到具有不同成员名称的所有其他实例。(即,不会显示来自具有相同名称的客户端的消息,且一个客户端自己的消息不会发送到该客户端的控制台窗口。)

演示

Chat 示例不是客户端和服务应用程序。它是一个真正的对等应用程序,其中每个实例都与其他实例对等。通过使用 IChat 双工协定,每个实例都可以向其他实例发送消息以及从其他实例接收消息。

重要概念

PeerChannel 是 Windows Communication Foundation (WCF) 中的一种多方对等 (P2P) 通信技术。该技术有助于进行安全、可伸缩且可靠的消息处理。可以受益于 PeerChannel 的多方应用程序的一个常见示例是协作应用程序(如聊天)。在聊天应用程序中,一组人员可以在不使用服务器的情况下通过对等方式相互通信。PeerChannel 支持用于消费者和企业方案的 P2P 协作、内容分发、负载平衡和分布式处理。

PeerChannel 引入了下列新概念:

  • 网格是对等节点的命名集合(一种相互连接图),其中的对等节点可以彼此通信并且每个节点由一个唯一的网格 ID 标识。

注意:

网格中的活动节点发布其网格名称以便其他节点可以找到它们。网格会根据不断更改的成员资格进行调整,在节点不断加入和离开网格的环境中具有可适应的连接性,并会动态优化以适应流量模式。

  • 网格中的活动节点发布其网格名称以便其他节点可以找到它们。网格会根据不断更改的成员资格进行调整,在节点不断加入和离开网格的环境中具有可适应的连接性,并会根据流量模式动态优化。

  • 对等节点是网格中的终结点。单个应用程序可以具有参与不同网格的多个对等节点。

  • 对等解析程序负责将网格 ID 解析为网格中节点的终结点地址。对等节点使用这些地址连接到网格中的其他节点。这使消息可以在网格中进行传播。

  • Chat 是一个 Windows 窗体应用程序。Chat 应用程序的每个实例都创建一个具有相同终结点地址的 IDuplexChannel。因为 Chat 应用程序的所有实例都使用相同的地址,所以由该应用程序的一个实例发送的消息会由其对等通道上的所有其他实例所接收。

    Chat 应用程序定义并实现 IChat 双工协定。IChat 协定仅允许单向操作,因为 ServiceModel 不支持单请求/多响应范例。(在一个多方通道中,发送到网格的单个请求可以生成多个响应。)

    本示例实现一个 Main 静态函数以创建一个具有 IChat 双工协定的 IClientChannel。该函数使用在配置文件中指定的终结点。

    所有 Chat 实例都必须使用相同的终结点地址以确保由一个实例发送的消息可以由所有其他实例所接收。

    本示例中的 Chat 实例使用自定义解析程序或使用默认对等解析程序 (PNRP) 来互相进行查找。请注意,PNRP 在 Windows Server 2003 上不可用。因此,在运行 Windows Server 2003 的系统中必须使用自定义解析程序来运行本示例。默认情况下,本示例设置为使用自定义解析程序。使用自定义解析程序还是默认解析程序由下面的配置文件中定义的聊天终结点确定。若要切换到默认对等解析程序 (PNRP),请在本示例的配置文件中的 bindingConfiguration 下将 BindingCustomResolver 替换为 BindingDefault

    <!-- 参与网格的聊天实例。-->
             <endpoint name="ChatEndpoint"
                       address="net.p2p://chatMesh/ServiceModelSamples/Chat" 
                       binding="netPeerTcpBinding" 
                       bindingConfiguration="BindingCustomResolver" 
                       contract="Microsoft.ServiceModel.Samples.IChat">
             </endpoint>

    为了使对等节点可以与对等通道自定义对等解析程序服务进行通信,要在配置文件中定义对等通道自定义对等解析程序的客户端配置。

    <!-- 用于与自定义解析程序服务通信的客户端。-->
    <client>
    <endpoint configurationName="CustomPeerResolverEndpoint"
    address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
        binding="netTcpBinding"
        bindingConfiguration="Binding3"
        contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
    </endpoint>
    </client>

    地址标识解析程序服务的地址。如果解析程序服务运行于远程计算机上,则应使用限定域名替换 localhost

    示例还演示如何从 IClientChannel 检索对等节点以及如何使用 IOnlineStatus 为联机和脱机事件进行注册。当对等节点连接到网格中至少一个其他对等节点时,会启动联机事件。当对等节点不再连接到网格中任何其他对等节点时,会启动脱机事件。

    由于对等通道未与服务元数据实用工具 (Svcutil.exe) 集成,所以当前无法生成元数据。

    在运行示例时,一个 Chat 实例发送的聊天消息会显示在其他 Chat 实例的控制台窗口中。在每个控制台窗口中按 Q 键然后按 Enter 可以关闭相应的实例。

    注意:

    该示例当前不处理基础结构可能引发的所有可能异常。如果要在商业或生产环境中使用这些示例,应遵循适当的异常处理最佳做法。